{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Numpy和原生Python用于数组计算的性能对比\n",
    "\n",
    "需求：\n",
    "* 实现两个数组的加法\n",
    "* 数组A是1~N数字的平方\n",
    "* 数组B是1~N数字的立方\n",
    "\n",
    "对比使用Numpy和原生Python的性能对比"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 引入Numpy的包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'1.17.1'"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用Python原生语法实现对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def python_sum(n):\n",
    "    \"\"\" Python实现数组的加法\n",
    "    @param n：数组的长度\n",
    "    \"\"\"\n",
    "    a = [i**2 for i in range(n)]\n",
    "    b = [i**3 for i in range(n)]\n",
    "    c = []\n",
    "    for i in range(n):\n",
    "        c.append(a[i] + b[i])\n",
    "    return c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0, 2, 12, 36, 80, 150, 252, 392, 576, 810]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试一下\n",
    "python_sum(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 使用Numpy实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def numpy_sum(n):\n",
    "    \"\"\" numpy实现数组的加法\n",
    "    @param n：数组的长度\n",
    "    \"\"\"\n",
    "    a = np.arange(n) ** 2\n",
    "    b = np.arange(n) ** 3\n",
    "    return a+b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  0,   2,  12,  36,  80, 150, 252, 392, 576, 810], dtype=int32)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 测试一下\n",
    "numpy_sum(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 性能对比：执行1000次"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.06 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit python_sum(1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "9.16 µs ± 2.13 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit numpy_sum(1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 性能对比：执行10W次"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "104 ms ± 20.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit python_sum(10 * 10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "424 µs ± 42.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit numpy_sum(10 * 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 性能对比：执行1000W次"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10.4 s ± 592 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
     ]
    }
   ],
   "source": [
    "%timeit python_sum(1000 * 10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "114 ms ± 15.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
     ]
    }
   ],
   "source": [
    "%timeit numpy_sum(1000 * 10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘制性能对比图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "pytimes = [1.06*1000, 104*1000, 10.4*1000*1000]\n",
    "nptimes = [9.16, 424, 114*1000]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\n",
    "    \"pytimes\":pytimes,\n",
    "    \"nptimes\":nptimes,\n",
    "})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pytimes</th>\n",
       "      <th>nptimes</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1060.0</td>\n",
       "      <td>9.16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>104000.0</td>\n",
       "      <td>424.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>10400000.0</td>\n",
       "      <td>114000.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      pytimes    nptimes\n",
       "0      1060.0       9.16\n",
       "1    104000.0     424.00\n",
       "2  10400000.0  114000.00"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x248203d1ec8>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "df.plot.bar()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
